home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / M2 / VGA.MOD < prev    next >
Text File  |  2000-09-26  |  4KB  |  297 lines

  1. (*$S- *)
  2. IMPLEMENTATION MODULE VGA;
  3.  
  4. FROM SYSTEM  IMPORT ASSEMBLER,ADDRESS,OFS,SEG;
  5. FROM System  IMPORT AX,BX,CX,DX,ES,DI,DS,SI,Trap,XTrap;
  6. FROM Strings IMPORT Length;
  7. FROM Mouse   IMPORT MouseOn,MouseOff;
  8. FROM GEM     IMPORT STRING;
  9.  
  10. PROCEDURE CopyVideo2Buffer(buffer : ADDRESS; x,y,w,h : CARDINAL);
  11. VAR seg   : CARDINAL;
  12.     ofs   : CARDINAL;
  13.     plane : CARDINAL;
  14.     x1    : CARDINAL;
  15.     bpr   : CARDINAL;
  16.     plus  : CARDINAL;
  17.  BEGIN
  18.  seg := buffer.SEG;
  19.  ofs := buffer.OFS;
  20.  plane := (w*h) DIV 8;
  21.  x1    := (y*80)+(x DIV 8);
  22.  bpr   := plane DIV h;
  23.  plus  := (640-w) DIV 8;
  24.  MouseOff;
  25.  ASM
  26.   MOV AX,0A000H
  27.   MOV BX,seg
  28.   MOV DS,AX
  29.   MOV ES,BX
  30.   MOV DI,ofs
  31.  
  32.   MOV DX,03CEH
  33.   MOV AX,0005H
  34.   OUT DX,AX
  35.  
  36.   MOV BL,0
  37. BMapLoop:
  38.   MOV CX,plane
  39.   MOV SI,x1
  40.   MOV DX,0
  41.   PUSH BX
  42.   PUSH DX
  43.  
  44.   MOV DX,03CEH
  45.   MOV AH,BL
  46.   MOV AL,04H
  47.   OUT DX,AX
  48.  
  49.   POP DX
  50. CopyLoop:
  51.   MOV BL,DS:[SI]
  52.   MOV ES:[DI],BL
  53.  
  54.   ADD SI,1
  55.   ADD DI,1
  56.  
  57.   ADD DX,1
  58.   CMP DX,bpr
  59.   JNE Weiter
  60.   MOV DX,0
  61.   ADD SI,plus
  62.  
  63. Weiter:
  64.   SUB CX,1
  65.   CMP CX,0
  66.   JNE CopyLoop
  67.  
  68.   POP BX
  69.   ADD BL,1
  70.   CMP BL,4
  71.   JNE BMapLoop
  72.  END;
  73.  MouseOn;
  74. END CopyVideo2Buffer;
  75.  
  76. PROCEDURE CopyBuffer2Video(buffer : ADDRESS; x,y,w,h : CARDINAL);
  77. VAR seg   : CARDINAL;
  78.     ofs   : CARDINAL;
  79.     plane : CARDINAL;
  80.     x1    : CARDINAL;
  81.     bpr   : CARDINAL;
  82.     plus  : CARDINAL;
  83.  BEGIN
  84.  seg := buffer.SEG;
  85.  ofs := buffer.OFS;
  86.  plane := (w*h) DIV 8;
  87.  x1    := (y*80)+(x DIV 8);
  88.  bpr   := plane DIV h;
  89.  plus  := (640-w) DIV 8;
  90.  MouseOff;
  91.  ASM
  92.   MOV AX,0A000H
  93.   MOV BX,seg
  94.   MOV DS,AX
  95.   MOV ES,BX
  96.   MOV DI,ofs
  97.  
  98.   MOV DX,03CEH
  99.   MOV AX,0005H
  100.   OUT DX,AX
  101.  
  102.   MOV BH,1
  103. BMapLoop:
  104.   MOV CX,plane
  105.   MOV SI,x1
  106.   MOV DX,0
  107.   PUSH DX
  108.  
  109.   MOV DX,03C4H
  110.   MOV AL,02H
  111.   MOV AH,BH
  112.   OUT DX,AX
  113.  
  114.   POP DX
  115. CopyLoop:
  116.   MOV BL,ES:[DI]
  117.   MOV DS:[SI],BL
  118.  
  119.   ADD SI,1
  120.   ADD DI,1
  121.  
  122.   ADD DX,1
  123.   CMP DX,bpr
  124.   JNE Weiter
  125.   MOV DX,0
  126.   ADD SI,plus
  127.  
  128. Weiter:
  129.   SUB CX,1
  130.   CMP CX,0
  131.   JNE CopyLoop
  132.  
  133.   SHL BH,1
  134.   CMP BH,16
  135.   JNE BMapLoop
  136.  
  137.   MOV DX,03C4H
  138.   MOV AX,0F02H
  139.   OUT DX,AX
  140.  END;
  141.  MouseOn;
  142. END CopyBuffer2Video;
  143.  
  144. PROCEDURE ClearVideo(x,y,w,h : CARDINAL);
  145. VAR plane : CARDINAL;
  146.     x1    : CARDINAL;
  147.     bpr   : CARDINAL;
  148.     plus  : CARDINAL;
  149.  BEGIN
  150.  plane := (w*h) DIV 8;
  151.  x1    := (y*80)+(x DIV 8);
  152.  bpr   := plane DIV h;
  153.  plus  := (640-w) DIV 8;
  154.  MouseOff;
  155.  ASM
  156.   MOV AX,0A000H
  157.   MOV DS,AX
  158.  
  159.   MOV DX,03CEH
  160.   MOV AX,0005H
  161.   OUT DX,AX
  162.  
  163.   MOV BH,1
  164. BMapLoop:
  165.   MOV CX,plane
  166.   MOV SI,x1
  167.   MOV DX,0
  168.   PUSH DX
  169.  
  170.   MOV DX,03C4H
  171.   MOV AL,02H
  172.   MOV AH,BH
  173.   OUT DX,AX
  174.  
  175.   POP DX
  176. CopyLoop:
  177.   MOV BL,0
  178.   MOV DS:[SI],BL
  179.  
  180.   ADD SI,1
  181.  
  182.   ADD DX,1
  183.   CMP DX,bpr
  184.   JNE Weiter
  185.   MOV DX,0
  186.   ADD SI,plus
  187.  
  188. Weiter:
  189.   SUB CX,1
  190.   CMP CX,0
  191.   JNE CopyLoop
  192.  
  193.   SHL BH,1
  194.   CMP BH,16
  195.   JNE BMapLoop
  196.  
  197.   MOV DX,03C4H
  198.   MOV AX,0F02H
  199.   OUT DX,AX
  200.  END;
  201.  MouseOn;
  202. END ClearVideo;
  203.  
  204. PROCEDURE CheckVGA() : BOOLEAN;
  205. BEGIN
  206.  AX := 01A00H;
  207.  Trap(010H);
  208.  
  209.  IF ((AX MOD 256)=01AH) THEN
  210.   RETURN(TRUE);
  211.  ELSE
  212.   RETURN(FALSE);
  213.  END (* IF *);
  214. END CheckVGA;
  215.  
  216. PROCEDURE SetRGB(c,r,g,b : CARDINAL);
  217. BEGIN
  218.  AX := 01010H;
  219.  BX := c;
  220.  CX := g*256+b;
  221.  DX := r*256;
  222.  Trap(010H);
  223. END SetRGB;
  224.  
  225. PROCEDURE PutChar(farbe,x,y : CARDINAL; zeichen : CHAR);
  226. BEGIN
  227.  ASM
  228.   MOV AH,2
  229.   MOV BX,x
  230.   MOV DL,BL
  231.   MOV BX,y
  232.   MOV DH,BL
  233.   MOV BX,0
  234.   INT 10H
  235.   MOV AH,9
  236.   MOV CX,1
  237.   MOV AL,zeichen
  238.   MOV DX,farbe
  239.   MOV BL,DL
  240.   MOV BH,0
  241.   INT 10H
  242.  END (* ASM *);
  243. END PutChar;
  244.  
  245. PROCEDURE PutText(farbe,x,y : CARDINAL; text : STRING);
  246. VAR i,j : CARDINAL;
  247. BEGIN
  248.  j := Length(text^)-1;
  249.  IF j>255 THEN j := 30; END;
  250.  MouseOff;
  251.  FOR i := 0 TO j DO
  252.   PutChar(farbe,x+i,y,text^[i]);
  253.  END (* FOR *);
  254.  MouseOn;
  255. END PutText;
  256.  
  257. PROCEDURE SetPixel(farbe,x,y : CARDINAL);
  258. BEGIN
  259.  ASM
  260.   MOV DX,farbe
  261.   MOV AL,DL
  262.   MOV AH,0CH
  263.   MOV BH,0
  264.   MOV DX,y
  265.   MOV CX,x
  266.   INT 10H
  267.  END (* ASM *);
  268. END SetPixel;
  269.  
  270. PROCEDURE DrawX(farbe,x,y,xw : CARDINAL);
  271. VAR z : CARDINAL;
  272. BEGIN
  273.  FOR z := x TO xw DO
  274.   SetPixel(farbe,z,y);
  275.  END (* FOR *);
  276. END DrawX;
  277.  
  278. PROCEDURE DrawY(farbe,x,y,yw : CARDINAL);
  279. VAR z : CARDINAL;
  280. BEGIN
  281.  FOR z := y TO yw DO
  282.   SetPixel(farbe,x,z);
  283.  END (* FOR *);
  284. END DrawY;
  285.  
  286. PROCEDURE DrawBorder(fp,bp,x,y,w,h : CARDINAL);
  287. VAR i : CARDINAL;
  288. BEGIN
  289.  MouseOff;
  290.  DrawX(fp,x,y,x+w);
  291.  DrawY(fp,x,y,y+h);
  292.  DrawX(bp,x+1,y+h,x+w-1);
  293.  DrawY(bp,x+w,y+1,y+h-1);
  294.  MouseOn;
  295. END DrawBorder;
  296.  
  297. END VGA.